package com.it.schoolbookshop_back.service;

import com.it.schoolbookshop_back.entities.po.Message;
import com.it.schoolbookshop_back.entities.vo.MessageVO;

import java.util.List;
import java.util.Map;

public interface MessageService {
    /**
     * 发送消息
     * @param senderId 发送者ID
     * @param receiverId 接收者ID
     * @param bookId 书籍ID（可选）
     * @param content 消息内容
     * @return 保存的消息对象，如果保存失败则返回null
     */
    Message sendMessage(Integer senderId, Integer receiverId, Integer bookId, String content);
    
    /**
     * 获取两个用户之间的聊天记录
     * @param userId1 用户1 ID
     * @param userId2 用户2 ID
     * @return 聊天记录列表
     */
    List<Message> getChatHistory(int userId1, int userId2);
    
    /**
     * 获取两个用户之间的聊天记录（带详细信息）
     * @param userId1 用户1 ID
     * @param userId2 用户2 ID
     * @param currentUserId 当前用户ID
     * @return 聊天记录列表，包含详细信息
     */
    List<MessageVO> getChatHistoryDetail(int userId1, int userId2, Integer currentUserId);
    
    /**
     * 获取用户的聊天列表
     * @param userId 用户ID
     * @return 聊天列表，包含最后一条消息和对话用户信息
     */
    List<Map<String, Object>> getUserChatList(Integer userId);
    
    /**
     * 获取用户的聊天列表，包含书籍名称信息
     * @param userId 用户ID
     * @return 聊天列表，包含最后一条消息、对话用户信息和书籍名称
     */
    List<Map<String, Object>> getUserChatListWithBookInfo(Integer userId);
    
    /**
     * 标记消息为已读
     * @param messageId 消息ID
     * @param userId 当前用户ID（必须是接收者）
     * @return 是否标记成功
     */
    boolean markMessageAsRead(Integer messageId, Integer userId);
    
    /**
     * 将特定用户发送给当前用户的所有未读消息标记为已读
     * @param senderId 发送者ID
     * @param currentUserId 当前用户ID（接收者）
     * @return 标记为已读的消息数量
     */
    int markAllMessagesAsRead(Integer senderId, Integer currentUserId);
}
